import Request from 'luch-request';
import {
  setToken,
  setRefreshToken,
  getToken
} from './token'
import {
  refreshToken,
  isRefreshRequest
} from './refreshToken';
//创建请求实例方法
function createRequest(options = {}) {
  return new Request({
    ...options
  });
}

//基地址
const baseURL: string = 'http://localhost:3000';

//创建http实例对象
const http = createRequest({
  baseURL,
  header: {
    Authorization: `Bearer ${getToken()}`,
  }
});


//响应拦截
http.interceptors.response.use(
  async (res) => {
    if (res.header.authorization) {
      // console.log(res.header)
      const token = res.header.authorization.replace('Bearer ', '')
      // console.log(token);

      setToken(token)
      // console.log(http)
      http.config.header.Authorization = `Bearer ${token}`
    }
    if (res.header.refreshtoken) {
      const refreshToken = res.header.refreshtoken.replace('Bearer ', '')
      // console.log(refreshToken)
      setRefreshToken(refreshToken)
      return res.data
    }
    if (res.data.code === 401 && !isRefreshRequest(res.config)) {
      // 刷新token
      console.log('刷新token')
      const isSuccess = await refreshToken()
      console.log(isSuccess)
      if (isSuccess) {
        //重新请求
        console.log('重新请求')
        res.config.header.Authorization = `Bearer ${getToken()}`
        const resp = http.request(res.config)
        return resp
      } else {
        //无权限
        console.log('退出登录');
        return res.data
      }
    }
    return res.data.data
  },
  //错误处理
  (error) => {
    // 利用http状态码可以实现不同情况接口错误内容的收集与反馈操作
    if (error && error.errMsg) {
      // 判断http请求的状态码，并设置不同的错误提示信息
      switch (error.statusCode) {
        case 400:
          error.errMsg = '错误请求';
          break;
        case 401:
          error.errMsg = '未授权，请重新登录';
          break;
        case 403:
          error.errMsg = '拒绝访问';
          break;
        case 404:
          error.errMsg = '请求错误,未找到该资源';
          break;
        case 405:
          error.errMsg = '请求方法未允许';
          break;
        case 408:
          error.errMsg = '请求超时';
          break;
        case 500:
          error.errMsg = '服务器端出错';
          break;
        case 501:
          error.errMsg = '网络未实现';
          break;
        case 502:
          error.errMsg = '网络错误';
          break;
        case 503:
          error.errMsg = '服务不可用';
          break;
        case 504:
          error.errMsg = '网络超时';
          break;
        case 505:
          error.errMsg = 'http版本不支持该请求';
          break;
        default:
          error.errMsg = '连接错误';
      }
      const errorData = {
        code: error.statusCode,
        message: error.errMsg
      };
      // 统一错误处理可以放这，例如页面提示错误...
      console.log('统一错误处理: ', errorData);
    }
    return Promise.reject(error);
  }
);

export default http;
